/********************************************
 *      循环队列
 * Created by zlj on 2024/6/27.
********************************************/
#include "RQueue.h"

/**
 * 初始化
 * @param q
 */
void InitRQueue(Queue *q)
{
    q->base = QUEUE_LEN;
    assert(q->base != NULL);
    q->front = q->rear = 0;
}

/**
 * 入队->队尾操作
 * @param q
 * @param x
 */
void EnRQueue(Queue *q, ElemType x)
{
    //判断循环队列是否已满
    if (((q->rear + 1) % QUEUE_MAXSIZE) == q->front)
        return;
    q->base[q->rear] = x;
    //更改尾指针的指向
    q->rear = (q->rear + 1) % QUEUE_MAXSIZE;
}

void DeRQueue(Queue *q)
{
    //判断循环队列是否为空
    if (q->front == q->rear)
        return;
    //如果非空，实现可循环出队
    q->front = (q->front + 1) % QUEUE_MAXSIZE;
}

void RQueue_Show(Queue *q)
{
    for (int i = q->front; i != q->rear;)
    {
        printf("%d ", q->base[i]);
        i = (i + 1) % QUEUE_MAXSIZE;
    }
    printf("\n");
}

void RQueue_Get_Header(Queue *q, ElemType *v)
{
    if (q->front == q->rear)
        return;
    *v = q->base[q->front];
}

int RQueue_Length(Queue *q)
{
    //计算尾指针位置与头指针位置的差距
    int len = q->rear - q->front;
    //如果为正数，那么len就是队列的长度；如果为负数，那么MAXSIZE+len才是队列的长度
    len = (len > 0) ? len : QUEUE_MAXSIZE + len;
    return len;
}

void RQueue_Clear(Queue *q)
{
    q->front = q->rear = 0;

}

void RQueue_Destory(Queue *q)
{
    //释放队列的存储空间
    free(q->base);
    //将队列基址置空
    q->base = NULL;
}